package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.service.GoodsTypeService;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Map;

@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {
    @Autowired
    private GoodsTypeDao goodsTypeDao;

    /**
     * 查询全部商品分类
     * @return
     */
    @Override
    public String loadGoodsType() {
        return this.getGoodsAllType(-1).toString();
    }

    /**
     * 添加分类信息
     * @param goodsTypeName
     * @param pId
     * @return
     */
    @Override
    public Boolean addGoodsType(String goodsTypeName, Integer pId) {
        //根据pid查询分类信息集合
        List<GoodsType> goodsTypeByPid = this.goodsTypeDao.getGoodsTypeByPid(pId);
        goodsTypeByPid.stream().forEach((goodsType)->{
            if (goodsType.getGoodsTypeName().equals(goodsTypeName)|| StringUtils.isEmpty(goodsTypeName)){
                return;
            }
        });
        Boolean flag = this.goodsTypeDao.save(goodsTypeName,pId,0);
        if (flag){
            //修改typeId为pid的分类状态为1
            this.goodsTypeDao.update(pId);
            return flag;
        }
        return flag;
    }

    /**
     * 删除分类信息
     * @param goodsTypeId
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean deleteById(Integer goodsTypeId) {
        GoodsType goodsType = this.goodsTypeDao.selectById(goodsTypeId);
        goodsTypeDao.deleteById(goodsTypeId);
        List<GoodsType> goodsTypeByPidList = this.goodsTypeDao.getGoodsTypeByPid(goodsType.getPId());
        if (goodsTypeByPidList.size()==0){
            goodsType.setGoodsTypeState(0);
            //修改分类的信息的的状态为0
            goodsTypeDao.updateByIdToState(goodsType);
            return true;
        }else {
            return true;
        }
}

    //递归查询所有类别
    private JsonArray getGoodsAllType(Integer pId) {
        JsonArray array = this.getGoodsTypeByPId(pId);
        for (int i = 0; i < array.size(); i++) {
            JsonObject jsOb = (JsonObject) array.get(i);
            if (jsOb.get("state").getAsString().equals("open")){//如果是叶子节点 则不在遍历
                continue;
            }else {
                jsOb.add("children",this.getGoodsAllType(jsOb.get("id").getAsInt()));
            }
        }
        return array;
    }

    /**
     * 根据父菜单ID获取列表
     * @param
     * @return
     */
    private JsonArray getGoodsTypeByPId(Integer pId) {
        JsonArray array = new JsonArray();
        List<GoodsType> list = goodsTypeDao.getGoodsTypeByPid(pId);
        //遍历集合
        for (GoodsType goodsType : list) {
            JsonObject obj = new JsonObject();
            obj.addProperty("id",goodsType.getGoodsTypeId());
            obj.addProperty("text",goodsType.getGoodsTypeName());
            obj.addProperty("pId",goodsType.getPId());
            obj.addProperty("iconCls","goods-type");
            if (goodsType.getGoodsTypeState() == 1){
                obj.addProperty("state","closed");//根节点
            }else {
                obj.addProperty("state","open");//叶子节点
            }
            JsonObject attributes = new JsonObject();
            attributes.addProperty("state",goodsType.getGoodsTypeState());
            obj.add("attributes", attributes);
            array.add(obj);
        }
        return array;
    }
}


